[新機能]Snowflakeでユーザー・ウェアハウス・クエリタグごとの消費クレジットを簡単に集計できる「QUERY_ATTRIBUTION_HISTORY」ビューがリリースされました
さがらです。
つい先日のリリースで、QUERY_ATTRIBUTION_HISTORYという新しいAccount Usageのビューが使えるようになりました。
すでにXやSnowflakeのコミュニティなどでも話題になっていますが、実際にわたしも挙動を確かめてみたので、簡単にですがブログにしてみます。
QUERY_ATTRIBUTION_HISTORYとは
まず、今回追加されたQUERY_ATTRIBUTION_HISTORYがどういったビューなのか簡単に説明します。
このビューを使用すると、過去365日間 (1年間) にアカウント内のウェアハウスで実行された特定のクエリの計算コストを確認することが出来ます。
下図はドキュメントからの引用ですが、ビューの1レコードが1クエリに該当し、消費したクレジットcredits_attributed_compute
やcredits_used_query_acceleration
で確認することが出来ます。
また、クエリを実行したユーザーを確認できるuser_name
や、クエリごとに設定したタグを確認できるquery_tag
という列もありますので、ユーザーごと、クエリタグごと、に消費したクレジットを確認することが可能です。
注意点としては、ドキュメントからの引用ですが以下の点が挙げられます。
- Account Usageのビューのため、更新まで最大6時間要すること
- 実行時間が短いクエリ (<= ~100 ミリ秒) は、このビューには含まれないこと
- すべての列のデータは、2024年7月1日以降のクエリで利用できること(この日付より前のデータの一部もビューで利用できるが、不完全な可能性があるとのこと)
- 実際、数年間使用している弊社の検証環境で雑に
select * ~中略~ order by start_time
を実行したところ、2024-08-19
以降に発行されたクエリしか確認できませんでした。
- 実際、数年間使用している弊社の検証環境で雑に
2024/9/5追記
@hrk_mrksさんがこちらのビューについて検証をしており、ドキュメントには記載のない注意点もあることがわかりました。(検証ありがとうございます!)
具体的には、「QUERY_ATTRIBUTION_HISTORYビューはウェアハウスのアイドル時間を考慮していないため、WAREHOUSE_METERING_HISTORYビューで確認できる消費クレジットよりもQUERY_ATTRIBUTION_HISTORYビューで確認できる消費クレジットは低くなる = QUERY_ATTRIBUTION_HISTORYビューで確認できる値は実際のコストと乖離がある」という点が注意事項となります。
試してみた
ということで、実際に試してみたいと思います。
使用するクエリは、下記のドキュメントを参考に少し条件を変更したものを使っています。
下記のクエリを実行すると、アカウント内のユーザーが今年どれだけのクレジットを使用したかを確認できます。
SELECT user_name, SUM(credits_attributed_compute) AS credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
AND start_time < CURRENT_DATE
GROUP BY user_name;
下記のクエリを実行すると、アカウント内の各ウェアハウスごとに今年どれだけのクレジットを使用したかを確認できます。
SELECT warehouse_name, SUM(credits_attributed_compute) AS credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
AND start_time < CURRENT_DATE
GROUP BY warehouse_name;
下記のクエリを実行すると、各クエリタグごとに今年どれだけのクレジットを使用したかを確認できます。
検証環境のためちゃんとしたクエリタグの運用をしていないのですが、最近私が検証したOmniで実行されたクエリや、Fivetranのdbt Transformationで実行されたクエリなどがクエリタグから確認できます。
WITH wh_bill AS (
SELECT SUM(credits_used_compute) AS compute_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
AND start_time < CURRENT_DATE
),
tag_credits AS (
SELECT COALESCE(NULLIF(query_tag, ''), 'untagged') AS tag,
SUM(credits_attributed_compute) AS credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
AND start_time < CURRENT_DATE
GROUP BY tag
),
total_credit AS (
SELECT SUM(credits) AS sum_all_credits
FROM tag_credits
)
SELECT tc.tag,
tc.credits / t.sum_all_credits * w.compute_credits AS attributed_credits
FROM tag_credits tc, total_credit t, wh_bill w;
参考までに、クエリタグ自体の設定は下記のSELECT社の記事が参考になると思います。ユーザーごとにデフォルトのクエリタグを設定したり、dbtでクエリタグを設定する方法が記載されています。
最後に
新しくリリースされたQUERY_ATTRIBUTION_HISTORYビューを試してみました。
注意点で述べた仕様から過去1年間すべてのクエリのデータがこのビューに存在しないことに注意する必要がありますが、このビュー1つで簡単にユーザーごとやクエリタグごとの集計が出来ますので、部署やプロジェクトごとの消費クレジットを管理したい場合にはとても便利なビューだと思います!